<?php
namespace app\admin\model;
use think\Model;
use think\Cookie;
use think\Config;
use think\Session;
use response\Response;

class Login extends Model
{
  /**
   * 登录验证
   * @return string 用户登录验证结果
   */
  static function login($username,$password,$captcha,$check){
  
  try{
    
    //加载模块配置参数:系统加密密钥,APP_ID
    define("APP_ID",config('APP_ID'));
    define("SECURITY_KEY",config('MD5_SECURITY_KEY'));
    define("ERROR_LIMIT",config('LIMIT_TIMES'));
    define("LOCK_DAYS",config('LOCK_DAYS'));
    
    //系统配置md5秘钥
    $md5_key=SECURITY_KEY;
    
    //Cookie前缀:APP_ID_
    Cookie::prefix(APP_ID.'_');

    //验证码
    if(strtolower($captcha)!=Session::get('authnum_session')){
      return json_return(3,'验证码错误'); 
    }
    
    //当前时间
    $time = time();
    
    //账户锁定固定时间限制
    $limit_time = LOCK_DAYS*24*60*60;
    
    //用户查询,判断账户锁定
    $res = \think\Db::name('user')->where('user_name','eq',$username)->find();
    
    //判断时间是否已经解锁
    if($res['limit_times']==0){
        if(strtotime($res['account_lock_time'])>$time){
            return json_return(4,'用户账户已经被锁定');
        }
    }

    //查询结果判断用户存在
    if($res){

      if(md5($password)==$res["user_password"]){
        
        //账号密码匹配时设置session
        Session::set('user_id',$res["user_id"]);
        Session::set('user_name',$res["user_name"]);
        Session::set('user_type',$res["user_type"]);
        
        //用户名
        $User['user_name'] = $res["user_name"];  
        
        if($check == '1'){
          
          //将用户登录信息数组，保存在Cookie中
          $value = serialize($User);
          $str = md5($value.$md5_key);
          
          //拼接Cookie内容
          $token = $str . $value;
          
          //调用Cookie的静态方法设置清除
          Cookie::set('userInfo',$token,60*60*24*30);
        }else{
          // 清空指定前缀的cookie
          Cookie::clear(APP_ID.'_');
        }

        //重置数据库表错误次数.登录次数
        \think\Db::name('user')
            ->where('user_id', $res["user_id"])
            ->update([
                'limit_times' => ERROR_LIMIT,
                'login_times' => $res["login_times"]+1
            ]);

        return json_return(1,'登录成功');   
      }
      else
      {
        //锁定次数
        $limit_times = $res["limit_times"]-1;

        //重置数据库表错误次数.锁定时间
        \think\Db::name('user')
            ->where('user_id', $res["user_id"])
            ->update([
                'limit_times' => $limit_times,
                'account_lock_time' => date("Y-m-d H:i:s",($time + $limit_time))
            ]);
        //判断剩余次数      
        if(0==$limit_times){
          return json_return(4,'用户账户被锁定');
        }else{
          return json_return(2,'用户密码错误',array("limit_times"=>$limit_times)); 
        }
      }
    }else{
        return json_return(0,'用户名称不匹配');
    }
  }
  catch(\Exception $e){ //异常捕捉
    $msg = $e->getMessage();
    return $this->error('错误提示:'.$msg,url('Login/index'));
  }
  
  }
}